home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mission 3
/
Mission 3.zip
/
Mission 3.iso
/
texte
/
qed
/
src
/
winlist.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-15
|
6KB
|
320 lines
/*
* Listenverwaltung für die Fenster.
*
* Es gibt zwei verschiedene Listen:
* used_list: - enthält alle offenen Fenster
* - erstes Element ist das Top-Window
* - einfach verkettet
*
* free_list: - enthält die unbenutzten Fenster, deren Größe bekannt ist
* - einfach verkettet mit Reihenfolge des w->init
*
* Wird ein neues Fenster benötigt, wird in der free_list nach dem mit dem
* kleinsten init der entsprechenden Klasse gesucht. Wird keins gefunden,
* wird in der free_list ein neues Element angehängt.
* Das Fenster aus der free_list wird dann in die used_list umgehängt und in
* der free_list gelöscht.
* Wird ein Fenster nicht mehr benötigt, wird es in used_list gelöscht und in
* free_list entsprechend seinem init einsortiert.
* Das erste Fenster einer Klasse steht in free_list immer ganz vorne.
*/
#include "global.h"
#include "qed.h"
#include "winlist.h"
WINDOWP used_list;
static WINDOWP free_list;
static int init_count;
#if 0
void dump_winlist(void)
{
WINDOWP p;
p = used_list;
Debug("used_list:\n");
while (p)
{
Debug(" class= %d, init= %d, title= %s\n", p->class, p->init, p->title);
p = p->next;
}
p = free_list;
Debug("free_list:\n");
while (p)
{
Debug(" class= %d, init= %d, title= %s\n", p->class, p->init, p->title);
p = p->next;
}
Debug("\n");
}
#endif
/*
* free_list: Neues Element in die Liste einhängen.
*/
static WINDOWP new_list_elem(int class)
{
WINDOWP new, p;
new = (WINDOWP)calloc(1, sizeof(WINDOW));
if (new != NULL)
{
new->next = NULL;
if (free_list == NULL) /* Erstes Element -> Wurzel */
free_list = new;
else
{
p = free_list;
while (p->next != NULL) /* Am Ende der Liste anhängen */
p = p->next;
p->next = new;
}
new->class = class;
new->handle = UNUSED;
new->init = init_count;
init_count++;
return new;
}
else
note(1, 0, NOMEMORY);
return NULL;
}
#if 0
/*
* Ein Element löschen.
*/
static void del_list_elem(WINDOWP w)
{
if (w == win_list) /* Wurzel? */
win_list = win_list->next;
else
{
WINDOWP p = win_list;
while (p->next != w) /* Vorgänger suchen */
p = p->next;
p->next = w->next; /* und Aushängen */
}
free(w);
w = NULL;
}
/*
* Gesamte Listen löschen
*/
static void kill_list(void)
{
while (win_list != NULL)
del_list_elem(win_list);
}
#endif
/*
* Fenster aus einer Liste aushänge, aber nicht löschen!
*/
static void unlink_elem(WINDOWP *list, WINDOWP w)
{
if (w == *list) /* Wurzel? */
*list = (*list)->next;
else
{
WINDOWP p = *list;
while (p->next != w) /* Vorgänger suchen */
p = p->next;
p->next = w->next; /* und Aushängen */
}
}
/*
* Fenster aus der free_list an den Anfang der used_list.
*/
static void free_to_used(WINDOWP w)
{
unlink_elem(&free_list, w);
if (used_list == NULL)
{
used_list = w;
w->next = NULL;
}
else
{
w->next = used_list;
used_list = w;
}
}
/*
* Fenster aus der used_list in die free_list einsortieren.
*/
static void used_to_free(WINDOWP w)
{
WINDOWP p, last;
unlink_elem(&used_list, w);
p = free_list;
if (free_list == NULL) /* kein Element */
{
free_list = w;
w->next = NULL;
}
else if (w->init < free_list->init) /* vor dem ersten einfügen */
{
w->next = free_list;
free_list = w;
}
else
{
p = free_list;
last = free_list;
while ((p) && (p->init < w->init))
{
last = p;
p = p->next;
}
w->next = last->next;
last->next = w;
}
}
/*
* used_list: Listenelement ganz an Anfang bzw. Ende
*/
void move_to_top(WINDOWP w)
{
WINDOWP p;
if (used_list == NULL)
return;
if (w == used_list) /* ist schon oben */
return;
p = used_list;
while (p->next != w) /* Vorgänger suchen */
p = p->next;
p->next = w->next;
w->next = used_list;
used_list = w;
}
void move_to_end (WINDOWP w)
{
WINDOWP p;
if (used_list == NULL)
return;
if (w->next == NULL) /* ist schon letzter */
return;
if (w == used_list) /* ist erster */
used_list = w->next;
else /* mitten drin */
{
p = used_list;
while (p->next != w) /* Vorgänger suchen */
p = p->next;
p->next = w->next;
}
p = used_list;
while (p->next != NULL) /* letzten suchen */
p = p->next;
p->next = w;
w->next = NULL;
}
/*
* Abmessungen eines Fensters aus der Konfig in die Liste einhängen
*/
void add_winlist(int class, GRECT *r)
{
WINDOWP w;
w = new_list_elem(class);
if (w)
w->work = *r;
}
/*
* Fensterparameter sichern.
*/
static WINDOWP search_init(WINDOWP list, int init)
{
WINDOWP p = list;
while (p)
{
if (p->init == init)
break;
p = p->next;
}
return p;
}
void save_winlist(FILE *fd)
{
int i;
WINDOWP p;
i = 0;
while (i < init_count)
{
p = search_init(used_list, i);
if (!p)
p = search_init(free_list, i);
if (p)
fprintf(fd, "Window=%d %d %d %d %d\n", p->class,
p->work.g_x, p->work.g_y, p->work.g_w, p->work.g_h);
i++;
}
}
/*
* Freies Fenster einer Klasse suchen, ggf. neu anlegen.
*/
WINDOWP get_new_window(int class)
{
WINDOWP p;
p = free_list;
while (p) /* zunächst unbenutzes suchen */
{
if ((p->handle == UNUSED) && (p->class == class))
break;
p = p->next;
}
if (p == NULL) /* kein unbenutztes gefunden */
p = new_list_elem(class);
free_to_used(p);
return p;
}
/*
* Fenster freigeben.
*/
void free_window(WINDOWP w)
{
used_to_free(w);
w->handle = UNUSED;
}
void init_winlist(void)
{
used_list = NULL;
free_list = NULL;
init_count = 0;
}
void term_winlist(void)
{
}